package com.nlgc365.designpattern.Chapter04_Pattern.Creation.P01_Singleton.Usage.IDGenerators;

import java.util.concurrent.atomic.AtomicLong;

/**
 * 单例模式-饱汉式
 * 功能: ID自增生成器
 * 存在问题: 解决了线程安全问题, 但是使用了类级别的锁, 性能低.
 */
public class IdGenerator3 {

    private AtomicLong atomicLong = new AtomicLong(0);

    private static IdGenerator3 idGenerator;

    //私有构造函数
    private IdGenerator3() {
    }

    //如果还没有创建实例才创建
    public synchronized static IdGenerator3 getInstance() { //这里通过加类级别锁, 保证只创建一个实例
        if (idGenerator == null) {  //存在问题: 进入该方法时, 多线程排队等待锁, 影响性能.
            idGenerator = new IdGenerator3();
        }
        return idGenerator;
    }

    /**
     * 生成自增ID
     *
     * @return 返回ID
     */
    public long getId() {
        return atomicLong.getAndIncrement();
    }
}
